package day26.homework;

/**
 * Student类表示一个学生实体，包含姓名和年龄属性
 * 该类提供了基本的学生信息管理功能，包括构造、获取和设置学生属性
 * 年龄必须在16-79范围内，否则抛出AgeOutRangeException异常
 */
public class Student {
    // 学生姓名属性，用于存储学生的姓名信息
    private String name;
    
    // 学生年龄属性，用于存储学生的年龄信息，有效范围为16-79岁
    private int age;
    
    /**
     * 无参构造方法
     * 创建一个空的学生对象，所有属性使用默认值
     * name属性默认为null，age属性默认为0
     */
    public Student() {
    }
    
    /**
     * 带参构造方法，用于创建具有指定姓名和年龄的学生对象
     * @param name 学生姓名，不能为空
     * @param age 学生年龄，必须在16-79岁之间
     * @throws AgeOutRangeException 当年龄不在合法范围(16-79)内时抛出此自定义异常
     */
    public Student(String name, int age) throws AgeOutRangeException {
        setName(name);
        setAge(age);
    }
    
    /**
     * 获取学生姓名的公共方法
     * 提供对私有属性name的安全访问
     * @return 返回当前学生对象的姓名
     */
    public String getName() {
        return name;
    }
    
    /**
     * 设置学生姓名的公共方法
     * 提供对私有属性name的安全修改
     * @param name 要设置的学生姓名
     */
    public void setName(String name) {
        this.name = name;
    }
    
    /**
     * 获取学生年龄的公共方法
     * 提供对私有属性age的安全访问
     * @return 返回当前学生对象的年龄
     */
    public int getAge() {
        return age;
    }
    
    /**
     * 设置学生年龄的公共方法
     * 提供对私有属性age的安全修改，包含数据验证逻辑
     * @param age 要设置的学生年龄，必须在16-79岁之间
     * @throws AgeOutRangeException 当传入的年龄值小于16或大于79时抛出此异常
     */
    public void setAge(int age) throws AgeOutRangeException {
        // 验证年龄是否在合法范围内(16-79岁)
        if (age < 16 || age > 79) {
            // 如果年龄超出范围，则抛出自定义异常，包含详细错误信息
            throw new AgeOutRangeException("年龄必须在16-79岁之间，当前年龄: " + age);
        }
        // 年龄合法，设置学生年龄
        this.age = age;
    }
    
    /**
     * 重写Object类的toString方法
     * 返回学生对象的字符串表示形式，便于调试和输出
     * @return 包含学生姓名和年龄信息的格式化字符串
     */
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}